// 专门处理登录action的文件
import type { RootThunkAction } from "@/types/store"
import type { LoginForm, LoginResponse } from "@/types/data"
import { http } from "@/utils/http"
import { setToken, clearToken } from "@/utils/auth"
// 异步请求action axios工具类 需要指定rootthunkaction类型  react-thunk
export const login = (loginParams: LoginForm): RootThunkAction => {
  return async (dispatch) => {
    //  执行请求 工具 请求地址  参数
    // 类型断言 非空断言  主观判断变量类型
    const res = (await http.post(
      "/authorizations",
      loginParams
    )) as LoginResponse
    // 得到了res 将得到的token进行存储
    setToken(res.data) // 类型进行了对应 写入前端缓存
    // redux 触发reducer  更新redux状态
    dispatch({ type: "login/token", payload: res.data }) // 这里为何没提示？ redux更新版本的一个缺陷
  }
}

// 定义一个 发送验证码action
export const sendCode = (mobile: string): RootThunkAction => {
  return async (dispatch) => {
    return http.get(`/sms/codes/${mobile}`) // 返回一个promise请求
  }
}

// 定义退出登录的action  也按照异步的action来定义
export const logout = (): RootThunkAction => {
  return (dispatch) => {
    // 实现登出操作
    dispatch({ type: "login/logout" }) // 分发给reducer
    // 将之前的存储在前端的token清除掉
    clearToken() // 清除前端的缓存token
  }
}
